package com.crm.system.service.returnMoney;

import com.alibaba.fastjson.JSONObject;
import com.crm.common.model.DhPageInfo;
import com.crm.model.entity.contractManager.CustomerContract;
import com.crm.model.entity.finishOrderProduct.FinishOrderProduct;
import com.crm.model.entity.report.ReportPerformanceTop;
import com.crm.model.entity.returnMoney.ReturnMoney;
import com.crm.model.entity.sys.UserAccount;
import com.crm.model.entity.sys.permissionManagement.SysCompany;
import com.crm.model.qo.productManager.AnalyseReturnMoneyProductQO;
import com.crm.model.qo.returnMoney.ReturnMoneyQO;
import com.crm.model.vo.customerManager.CustomerOrderBackMoneyVO;
import com.crm.model.vo.orderManager.CustomerProductOrderVO;
import com.crm.model.vo.orderManager.ImportOrderNumber;
import com.crm.model.vo.orderManager.PerformanceRankVO;
import com.crm.model.vo.productManager.AnalyseReturnMoneyProductVO;
import com.crm.model.vo.productManager.PerformanceAnalysisVO;
import com.crm.model.vo.productManager.ShelfProductsVO;
import com.crm.model.vo.returnMoney.*;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.math.BigDecimal;
import java.text.ParseException;
import java.util.Date;
import java.util.List;
import java.util.Map;

public interface ReturnMoneyService {
    DhPageInfo<ReturnMoneyVO> selectCustomerProductList(ReturnMoneyQO returnMoneyQO, Integer pageIndex, Integer pageSize, String sortName, String sortOrder);

    /**
     * 录入回款
     * @param returnMoney
     */
    Map<String,Object> addReturnMoney(ReturnMoney returnMoney,Integer dataSourceType,boolean preReturnMoneyFlag);

    /**
     * 修改回款信息
     * @param returnMoney
     */
    String updateReturnMoney(ReturnMoney returnMoney);


    /**
     * 将录入回款的方法合并
     * @param returnMoney
     * @param dataSourceType 0-正常录入，1-导入
     * @return
     */
    Map<String,Object> mergeAddReturnMoneyMethod(ReturnMoney returnMoney,Integer dataSourceType,boolean preReturnMoneyFlag) throws ParseException;

    /**
     * 查询业务员每月业绩存入redis
     * @return
     */
   void getSalesmanResultsByMonth();

  /**
   * 查询业务员每年业绩存入redis
   * @return
   */
  void getSalesmanResultsByYear();

    /**
     * 会员发卡
     * @param orderId
     */

    void hairpin(String orderId) throws ParseException;
    /**
     * 判断回款金额是否合法
     * @param returnMoney
     * @return
     */
    boolean ifReturnMoney(ReturnMoney returnMoney);

    /**
     * 判断合同状态是否正常
     * @param returnMoney
     * @return
     */
    boolean contractReviewStatus(ReturnMoney returnMoney);

    /***
     * @Description: 添加产品列表
     * @Param:
     * @Author: luojie
     * @Date: 2021/5/8 17:47
     */
    AddFinishResultVO addFinishProductList(List<FinishOrderProduct> finishList, Integer index, String contractType,ReturnMoney returnMoney,Integer type);


    /**
     * 业绩、到款金额存redis
     * @param gradeMoney 业绩金额
     * @param companyId 公司id
     * @param returnMoney 到款金额
     */
    void returnMoneyToRedis(BigDecimal gradeMoney, String companyId, BigDecimal returnMoney, Date arriveTime);

    /**
     * 订单是否作废
     * @param returnMoney
     * @return
     */
    boolean orderIfAbolish(ReturnMoney returnMoney);

    /**
     * 删除回款信息
     * @param returnMoneyId
     */
    boolean delReturnMoney(String returnMoneyId);

    /**
     * 导入到款记录
     * @param list
     * @param companyId
     * @return
     */
    JSONObject importReturnMoney(List<ImportReturnMoneyVO> list, String companyId);

    /**
     * 分公司财务统计回款列表
     * @param returnMoneyQO
     * @param pageIndex
     * @param pageSize
     * @param sortName
     * @param sortOrder
     * @return
     */
    DhPageInfo<ReturnMoneyVO> selectStatReturnMoney(ReturnMoneyQO returnMoneyQO, Integer pageIndex, Integer pageSize, String sortName, String sortOrder);

    /**
     * 总部财务统计回款列表-分页
     * @param returnMoneyQO
     * @param pageIndex
     * @param pageSize
     * @param sortName
     * @param sortOrder
     * @return
     */
    DhPageInfo<ReturnMoneyVO> selectSuperStatReturnMoneyPage(ReturnMoneyQO returnMoneyQO, Integer pageIndex, Integer pageSize, String sortName, String sortOrder);

    /**
     * 总部财务统计回款列表 list
     * @param returnMoneyQO
     * @return
     */
    List<ReturnMoneyVO> selectSuperStatReturnMoney(ReturnMoneyQO returnMoneyQO);
    /**
     * 分公司财务统计回款列表
     * @param returnMoneyQO
     * @param pageIndex
     * @param pageSize
     * @param sortName
     * @param sortOrder
     * @return
     */
    DhPageInfo<ReturnMoneyVO> selectStatBackMoneyPage(ReturnMoneyQO returnMoneyQO, Integer pageIndex, Integer pageSize, String sortName, String sortOrder);

    /**
     * 总部财务统计回款列表
     * @param returnMoneyQO
     * @param pageIndex
     * @param pageSize
     * @param sortName
     * @param sortOrder
     * @return
     */
    DhPageInfo<ReturnMoneyVO> selectSuperStatBackMoney(ReturnMoneyQO returnMoneyQO, Integer pageIndex, Integer pageSize, String sortName, String sortOrder);

    /**
     * 总部财务统计退款列表
     * @param returnMoneyQO
     * @return
     */
    List<ReturnMoneyVO> selectStatBackMoney(ReturnMoneyQO returnMoneyQO);

    /**
     * 导入退款记录
     * @param list
     * @param companyId
     * @return
     */
    JSONObject importBackMoney(List<ImportBckMoneyVO> list, String companyId);

    /**
     * 回款记录数据结构改变修改
     * @param list
     * @param companyId
     * @return
     */
    JSONObject importUpdateReturnMoney(List<ImportReturnMoneyVO> list, String companyId);

    /**
     * 发放会员卡
     * @param order
     * @param productCode
     * @param productQuantity
     * @param productFinalPrice
     * @param user
     */
    String reqCrm(CustomerProductOrderVO order, String productCode, String productQuantity, BigDecimal productFinalPrice, UserAccount user,String finishOrderProductNum);

    /**
     * 查询退款统计信息
     * @param returnMoneyQO
     * @param pageIndex 页码
     * @param pageSize 条数
     * @param sortName 分组名称
     * @param sortOrder 分组类型
     * @return
     */
    DhPageInfo<CustomerOrderBackMoneyVO> selectOrderBackMoney(ReturnMoneyQO returnMoneyQO, Integer pageIndex, Integer pageSize, String sortName, String sortOrder);

    /**
     * 导出回款数据成excel
     * @param returnMoneyQO 查询条件
     * @param response
     * @return
     */
    boolean exportReturnMoneyList(ReturnMoneyQO returnMoneyQO, HttpServletResponse response) throws IOException;

    /**
     * 订单回款错误关联
     * @param orderId
     * @param shiftOrderNumber
     * @return
     */
    String shiftOrderReturnMoney(String orderId, String shiftOrderNumber,String finishId,Integer type,BigDecimal returnMoney);

    /***
     * @Description:维护客户表会员等级
     * @Param:contract 合同
     * @Author: luojie
     * @Date: 2021/9/7 16:01
     */
    void updateCustomer(CustomerContract contract);

    boolean testReturnMoneyAndProduct(String orderNumber);

    /**
     * 根据主键Id修改提成发放状态
     * @Author pym
     * @Date  2021/9/24 10:09
     * @param returnMoneyIds 回款记录表主键
     * @param royaltyStatus 提成发放状态
     * @return {@link {java.lang.Boolean}}
     */
    void updateRoyaltyStatusByReturnMoneyId(List<String> returnMoneyIds, String royaltyStatus);

    String addReturnMoneyCustomerInfo(String companyId,List<ImportOrderNumber> list);

    /**
     * 财务明细
     * @return
     */
    DhPageInfo<FinancialDetailsVO> selectFinancialDetails(ReturnMoneyQO returnMoneyQO, Integer pageIndex, Integer pageSize, String sortName, String sortOrder);

    /**
     * 业绩明细
     * @return
     */
    DhPageInfo<PerformanceDetailsVO> selectPerformanceDetails(ReturnMoneyQO returnMoneyQO, Integer pageIndex, Integer pageSize, String sortName, String sortOrder);

    /**
     * 按照年月查询业绩明细
     * @return
     */
    List<PerformanceDetailsVO> selectMonthPerformanceDetails(ReturnMoneyQO returnMoneyQO);

    /**
     * 统计个人业绩总和
     * @return
     */
    BigDecimal sumScoreMoney(ReturnMoneyQO returnMoneyQO);

    /**
     * 报表统计 - 业绩分析 - 销售产品分析
     * @Author pym
     * @Date  2021/9/27 14:47
     * @param pageIndex -页码
     * @param pageSize -分页大小
     * @param sortName -排序列名字
     * @param sortOrder -排序规则(asc/desc)
     * @param analyseReturnMoneyProductQO -查询条件
     * @return {@link {com.crm.common.model.DhPageInfo<com.crm.model.vo.productManager.AnalyseReturnMoneyProductVO>}}
     */
    DhPageInfo<AnalyseReturnMoneyProductVO> selectReturnMoneyProductList(Integer pageIndex, Integer pageSize,
                                                                         String sortName, String sortOrder,
                                                                         AnalyseReturnMoneyProductQO analyseReturnMoneyProductQO);

    /**
     * 导出业绩明细数据
     * @param returnMoneyQO
     * @return
     */
    List<PerformanceDetailsVO> exportPerformanceDetails(ReturnMoneyQO returnMoneyQO);

    /**
     * 查询公司列表
     * @return
     */
    List<SysCompany> selectSysCompanyList();

    /*Boolean updateDate();*/

    /**
     * 报表统计 - 业绩分析 - 销售额度统计表
     * @Author pym
     * @Date  2021/10/21 10:00
     * @param analyseReturnMoneyProductQO  -查询条件
     * @return {@link {com.crm.model.vo.productManager.PerformanceAnalysisVO}}
     */
    PerformanceAnalysisVO selectPerformanceAnalysis(AnalyseReturnMoneyProductQO analyseReturnMoneyProductQO);

    /**
     * 双十一报表
     * @param entryArea
     * @param month
     * @return
     */
    List<PerformanceRankVO> reportForNovember(String entryArea,String year, String month,String day);

    List<ReportPerformanceTop> getReportPerformanceTop();

    /**
     * 补码
     *
     * @return
     */
    String repairHairpin(CustomerProductOrderVO orderDetailVO, String productCode, BigDecimal productFinalPrice, UserAccount user, String finishOrderProductNum);

    /**
     * 报表统计 - 业绩分析 - 销售产品分析 - 高级筛选 产品
     * @Author pym
     * @Date  2021/12/29 16:36
     * @param
     * @return {@link {com.crm.model.vo.productManager.ShelfProductsVO}}
     */
    ShelfProductsVO selectShelfProductList();
}
